package com.easygem.common.utils;

import com.easygem.common.model.system.DeptClient;

import java.util.*;

/**
 * @author luoxi
 * @version 1.0
 * @className DeptUtil
 * @Description 部门递归工具类
 * @date 2024/12/25 16:18
 */
public class DeptUtil {
    // 新增方法：获取部门及其所有子部门ID（包括自身）
    public List<Long> getAllSubDeptIds(Long deptId, List<DeptClient> allDepts) {
        List<Long> subDeptIds = new ArrayList<>();
        Queue<Long> queue = new LinkedList<>();
        queue.add(deptId);
        while (!queue.isEmpty()) {
            Long currentId = queue.poll();
            subDeptIds.add(currentId);
            // 遍历所有部门，找到 parentId = currentId 的子部门
            for (DeptClient dept : allDepts) {
                if (dept.getParentId() != null && dept.getParentId().equals(currentId)) {
                    queue.add(dept.getDeptId());
                }
            }
        }
        return subDeptIds;
    }
    // 对外公开的方法，用于获取给定部门ID下的所有子部门（递归查询）
    // 参数categoryId表示要查询的起始部门的ID
    public static List<DeptClient> getAllDept(String categoryId, List<DeptClient> deptClientList) {
        List<DeptClient> result = new ArrayList<>();
        // 先获取所有部门数据构建成以ID为键的映射表，方便后续查找
        Map<String, DeptClient> deptMap = buildCategoryMap(deptClientList);
        // 调用私有递归方法进行实际的查询操作，传入起始部门、结果列表和部门映射表
        getAllSubCategoriesRecursive(categoryId, result, deptMap);
        return result;
    }

    // 私有方法，用于将所有部门数据构建成以ID为键的映射表，便于根据ID快速查找部门对象
    private static Map<String, DeptClient> buildCategoryMap(List<DeptClient> deptClientList) {
        Map<String, DeptClient> deptMap = new HashMap<>();
        for (DeptClient deptClient : deptClientList) {
            deptMap.put(String.valueOf(deptClient.getDeptId()), deptClient);
        }
        return deptMap;
    }

    // 私有递归方法，真正执行递归查询的逻辑
    // deptId表示当前正在处理的部门的ID
    // resultList是一个引用传递的列表，用于不断累加存储找到的子分类
    // deptMap是所有分类的映射表，用于根据ID查找分类对象
    private static void getAllSubCategoriesRecursive(String deptId, List<DeptClient> resultList, Map<String, DeptClient> deptMap) {
        // 步骤一：查找当前部门ID对应的部门对象
        DeptClient deptClient = deptMap.get(deptId);
        if (deptClient == null) {
            return; // 如果部门不存在，直接返回，结束当前递归分支
        }
        //如何集合中没有数据，就将当前的部门信息，添加到集合中
        if (resultList.size()<1){
            resultList.add(deptClient);
        }
        // 步骤二：获取所有部门数据，遍历查找当前部门的直接子部门，并添加到结果列表
        List<DeptClient> allCategories = new ArrayList<>();
        for (DeptClient deptClient1 : deptMap.values()) {
            allCategories.add(deptClient1);
        }
        System.out.println("8888888888888888"+allCategories);
        //List<Dept> allCategories = (List<Dept>) deptMap.values();
        for (DeptClient deptClient1 : allCategories) {
            if (deptClient1.getParentId().equals(deptId) ) {
                resultList.add(deptClient1);
                // 步骤三：对于每个找到的直接子部门，递归调用自身，继续查找其下的子部门
                getAllSubCategoriesRecursive(String.valueOf(deptClient1.getDeptId()), resultList, deptMap);
            }
        }
    }
}
